Кэширование
===========

Кэширование — это простой и эффективный способ повысить производительность
веб-приложения. Сохраняя относительно статичные данные в кэше и извлекая их из кэша,
когда потребуется, мы экономим время, затрачиваемое на генерацию данных.

Использование кэша в Yii подразумевает, главным образом, конфигурирование и обращение к
компоненту кэширования. Ниже приведена конфигурация приложения, определяющая компонент кэширования,
использующий memcache с двумя кэш-серверами.

~~~
[php]
array(
	…
	'components'=>array(
		…
		'cache'=>array(
			'class'=>'system.caching.CMemCache',
			'servers'=>array(
				array('host'=>'server1', 'port'=>11211, 'weight'=>60),
				array('host'=>'server2', 'port'=>11211, 'weight'=>40),
			),
		),
	),
);
~~~

В ходе работы приложения обратиться к компоненту кэширования
можно следующим образом: `Yii::app()->cache`.

Yii предоставляет несколько компонентов кэширования, которые могут сохранять
кэшированные данные в различных хранилищах. Например, компонент [CMemCache] инкапсулирует расширение
memcache для PHP и использует оперативную память в качестве хранилища; компонент
[CApcCache] инкапсулирует расширение APC для PHP; компонент
[CDbCache] сохраняет кэшируемые данные в базе данных. Ниже приведён список
доступных компонентов кэширования:

   - [CMemCache]: использует
   [расширение memcache для PHP](http://php.net/manual/en/book.memcache.php).

   - [CApcCache]: использует
   [расширение APC для PHP](http://php.net/manual/en/book.apc.php).

   - [CXCache]: использует
   [расширение XCache для PHP](http://xcache.lighttpd.net/).

   - [CEAcceleratorCache]: использует
   [расширение EAccelerator для PHP](http://eaccelerator.net/).

   - [CRedisCache]: использует [redis](http://redis.io/).

   - [CDbCache]: использует таблицу базы данных для хранения кэшируемых данных.
По умолчанию создаёт и использует базу данных SQLite3 во временном каталоге.
Мы можем явно задать используемую базу данных, установив значение свойства
[connectionID|CDbCache::connectionID].

   - [CZendDataCache]: использует
   [Zend Data Cache](http://files.zend.com/help/Zend-Server-6/zend-server.htm#data_cache_component.htm).

   - [CWinCache]: использует [WinCache](http://iis.net/downloads/microsoft/wincache-extension)
   ([смотрите также](http://php.net/manual/en/book.wincache.php)).


   - [CFileCache]: использует файлы для хранения кэшированных данных. Хорошо
подходит для больших единиц данных (например, страниц).

   - [CDummyCache]: кэш-пустышка, не осуществляющий кэширование вовсе.
Необходим для упрощения кода, проверяющего доступность кэша. Мы можем воспользоваться данным
компонентом во время разработки или в случае, если сервер не поддерживает кэширование.
Когда "настоящее" кэширование будет включено, мы сможем переключиться на использование
соответствующего компонента. В обоих случаях мы можем использовать код
`Yii::app()->cache->get($key)`, чтобы попытаться извлечь кэшированные данные,
но не беспокоясь о том, что `Yii::app()->cache` может быть равен `null`.


> Tip|Подсказка: Все перечисленные компоненты кэширования наследуют базовый класс
[CCache], поэтому можно переключаться между различными типами кэширования без
изменения кода, использующего кэш.

Кэширование может использоваться на различных уровнях. На низшем уровне мы
используем кэширование для хранения «атомарных» (одиночных) данных,
таких как переменные, и называем это *кэшированием данных*. На следующем уровне
мы храним в кэше фрагменты страниц, генерируемые частью скрипта представления.
И наконец, на высшем уровне мы храним в кэше целую страницу и извлекаем её из кэша при
необходимости.

В следующих подразделах мы подробно разберём, как использовать кэширование на
этих уровнях.

> Note|Примечание: По определению, кэш — энергозависимая среда.
Это означает, что не гарантируется наличие в кэше данных даже в том случае, если они ещё не устарели.
Поэтому не используйте кэш как постоянное хранилище данных (например, не
используйте кэш для хранения сессионных данных).